/***
 * 常用函数工具类
 * 叶平平[yepp]
 */
/**
 * 相当于Java中String对象的trim()方法，去除前后空格
 * @return {}
 */
String.prototype.trim = function(){
	return this.replace(/(^\s*)|(\s*$)/g, "");
};

//为Javascript原生的Array对象增加indexOf方法，获得对象在Array中的索引号
if(!Array.prototype.indexOf){
	Array.prototype.indexOf = function(elt){
		var len = this.length;
		var from  = Number(arguments[1]) || 0;
		from  = (from < 0)? Math.ceil(from): Math.floor(from);
		if(from < 0){
			from += len;
		}
		for(; from < len; from++){
			if(from in this && this[from] === elt){
				return from;
			}
		}
		return -1;
	};
};


//为Javascript原生的Array对象增加remove()方法
//网上的做法是直接this.indexOf(obj)这样做，在FF下是正确的，但在IE下会报
//不支持该属性或方法,原因是Array不能够直接indexOf()，使用join('')后，将
//会返回所有内容，且未添加任何分割符
Array.prototype.remove = function(obj){
	var index = this.indexOf(obj);
	if(index >= 0){
		this.splice(index,1);
		return true;
	}
	return false;
};

//格式化日期对象，使用方法：
//var showtime = new Date().format("yyyy-MM-dd hh:mm:ss");
Date.prototype.format = function(format){
   var o = {
     "M+" : this.getMonth()+1, //month
     "d+" : this.getDate(),    //day
     "h+" : this.getHours(),   //hour
     "m+" : this.getMinutes(), //minute
     "s+" : this.getSeconds(), //second
     "q+" : Math.floor((this.getMonth()+3)/3), //quarter
     "S" : this.getMilliseconds() //millisecond
   };
   if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
     (this.getFullYear()+"").substr(4 - RegExp.$1.length));
   for(var k in o)if(new RegExp("("+ k +")").test(format))
     format = format.replace(RegExp.$1,
       RegExp.$1.length==1 ? o[k] :
         ("00"+ o[k]).substr((""+ o[k]).length));
   return format;
};

//+---------------------------------------------------   
//| 比较两个日期之间相差天数
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd
//+---------------------------------------------------
function differenceDate(date1,date2){
	var s1 = date1;
	var s2 = date2;
	s1 = s1.replace(/-/g,"/");
	s2 = s2.replace(/-/g,"/");
	s1 = new Date(s1);
	s2 = new Date(s2);
	var time = s1.getTime() - s2.getTime();
	var days = Math.abs(parseInt(time / (1000 * 60 * 60 * 24)));
	return days;
}

//+---------------------------------------------------   
//| 比较日期1是否大于日期2
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd
//| compareDate('2007-12-31','2007-01-01')返回true
//+---------------------------------------------------
function compareDate(date1,date2){
	var s1 = date1;
	var s2 = date2;
	s1 = s1.replace(/-/g,"/");
	s2 = s2.replace(/-/g,"/");
	s1 = new Date(s1);
	s2 = new Date(s2);
	return (s1.getTime() > s2.getTime()) ? true : false;
}

//+---------------------------------------------------   
//| 字符串转成日期类型    
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd   
//+---------------------------------------------------   
function StringToDate(DateStr){
    var converted = Date.parse(DateStr);
    var myDate = new Date(converted);
    if (isNaN(myDate)){
        //var delimCahar = DateStr.indexOf('/')!=-1?'/':'-';
        var arys= DateStr.split('-');
        myDate = new Date(arys[0],--arys[1],arys[2]);
    }
    return myDate;
}


// 将日期字符串转换为yyyy-MM-dd的标准格式
function formatDate(dateStr){
	return dateStr.replace(/\s\d+:\d+:\d+$/,'');
}

//+---------------------------------------------------   
//| 从JSON格式的详细日期中获得yyyy-MM-dd格式的日期
//+---------------------------------------------------
function simpleDateFromJson(json){
	if(isNotEmpty(json)){
		var year,month,day;
		year = 1900+json.year;
		month=json.month<9?'0'+(json.month+1):(json.month+1);
		day = json.date<10?'0'+json.date:json.date;
		return year + '-' + month + '-' + day;
	}else{
		return '';
	}
}

//+---------------------------------------------------   
//| 以标准格式(yyyy-MM-dd)获得当前日期
//+---------------------------------------------------
function getToday(){
	return getStandardDate(new Date());
}

//+---------------------------------------------------   
//| 根据日期类型数据返回'yyyy-MM-dd'的格式
//| vDate:日期格式的对象
//+---------------------------------------------------
function getStandardDate(vDate){
	if(isEmpty(vDate)){return '';}
	if(typeof(vDate)=='string')vDate = new Date(vDate);//若用户传递字符串格式，则进行转换
	var dateStr = '';
	dateStr = vDate.getFullYear() + '-';
	if(vDate.getMonth()<9){
		dateStr += '0' + (vDate.getMonth()+1) + '-';
	}else{
		dateStr += (vDate.getMonth()+1) + '-';
	}
	if(vDate.getDate()<10){
		dateStr += '0' + vDate.getDate();
	}else{
		dateStr += vDate.getDate();
	}
	return dateStr;
}

//+---------------------------------------------------   
//| 根据传入日期，获得年份
//| 日期格式：XXXX-XX-XX 
//+---------------------------------------------------
function getYearByDate(vDate){
	if(isEmpty(vDate)){return '';}
	var tempDate = vDate;
	if(typeof(vDate)=='string'){
		tempDate = vDate.replace("-", "/").replace("-", "/");
		tempDate = new Date(tempDate);//若用户传递字符串格式，则进行转换
	}
	return tempDate.getFullYear();
}

//+---------------------------------------------------   
//| 根据传入日期，要处理的天数，进行加/减计算(num：加使用正数，减时使用负数)
//| 日期格式：XXXX年XX月XX日 
//+---------------------------------------------------
function dateCalc(dateParameter, num){
	var newDate, dateString = "", monthString = "", dayString = "";
	if(typeof(dateParameter) != 'undefined' && dateParameter instanceof Date){
		newDate = dateParameter;
	}else{
		var translateDate = dateParameter.replace("-", "/").replace("-", "/");
		newDate = new Date(translateDate);
	}
	newDate = newDate.valueOf();  
	newDate = newDate + num * 24 * 60 * 60 * 1000;  
	newDate = new Date(newDate);  
   
	//如果月份长度少于2，则前加 0 补位  
	if ((newDate.getMonth() + 1).toString().length == 1) {  
		monthString = 0 + "" + (newDate.getMonth() + 1).toString();  
	} else {  
		monthString = (newDate.getMonth() + 1).toString();  
	}
	//如果天数长度少于2，则前加 0 补位  
	if (newDate.getDate().toString().length == 1) {  
		dayString = 0 + "" + newDate.getDate().toString();  
	} else {  
		dayString = newDate.getDate().toString();  
	}
	dateString = newDate.getFullYear() + "-" + monthString + "-" + dayString;  
	return dateString;  
}
//+---------------------------------------------------   
//| 根据传入日期，要处理的年份，进行加/减计算(num：加使用正数，减时使用负数)
//| 日期格式：XXXX年XX月XX日 
//+---------------------------------------------------
function yearCalc(dateParameter, num) {  
	var newDate, dateString = "", monthString = "", dayString = "";
	if(typeof(dateParameter) != 'undefined' && dateParameter instanceof Date){
		newDate = dateParameter;
	}else{
		var translateDate = dateParameter.replace("-", "/").replace("-", "/");
		newDate = new Date(translateDate);
	}
   
	//如果月份长度少于2，则前加 0 补位  
	if ((newDate.getMonth() + 1).toString().length == 1) {  
		monthString = 0 + "" + (newDate.getMonth() + 1).toString();  
	} else {  
		monthString = (newDate.getMonth() + 1).toString();  
	}
	//如果天数长度少于2，则前加 0 补位  
	if (newDate.getDate().toString().length == 1) {  
		dayString = 0 + "" + newDate.getDate().toString();  
	} else {  
		dayString = newDate.getDate().toString();  
	}
	dateString = (newDate.getFullYear()+num) + "-" + monthString + "-" + dayString;  
	return dateString;  
}


//+---------------------------------------------------   
//| 将JSON对象指定列的所有行数据转换为Array对象
//| jsonObj:JSON格式变量(该对象须是Array类型)
//| columnName:JSON对象的属性名
//+---------------------------------------------------
function ConvertJsonToArray(jsonObj,columnName){
	var array = new Array(jsonObj.lenght);
	for (var i = 0; i < jsonObj.length; i++) {
		array[i] = eval('jsonObj[i].'+columnName);
	}
	return array;
}

//+---------------------------------------------------   
//| 将后台查询返回的JSON数据转换为Javascript能识别的Json格式
//| obj:JSON格式数据内容
//+---------------------------------------------------
function parseJsonObject(obj){
	return isNotEmpty(obj)?eval('('+obj+')'):'';
}

//+---------------------------------------------------   
//| 判断对象/变量内容是否不为空
//+---------------------------------------------------
function isNotEmpty(obj){	
	if(typeof obj != 'undefined' && obj != null && obj.length != 0){
		if(typeof obj == 'string'){
			return (obj.toUpperCase()!='NULL' && obj.trim()!='') ? true : false;
		}else{
			return true;
		}
	}else{
		return false;
	}
}

//+---------------------------------------------------   
//| 判断对象/变量内容是否为空
//+---------------------------------------------------
function isEmpty(obj){
	return !isNotEmpty(obj);
}

//将输入框设置为灰色背景
//inputName:输入框对象的ID名
function setInputDrak(inputName){
	$("#"+inputName).css("background-color","#DDDDDD");
	$("#"+inputName).css("color","#666666");
	$("#"+inputName).attr("readonly","readonly");
}
//将输入框设置为灰色背景
//inputObj:输入框Jquery对象
function setInputObjDrak(inputObj){
	$(inputObj).css("background-color","#DDDDDD");
	$(inputObj).css("color","#666666");
	$(inputObj).attr("readonly","readonly");
}

//将输入框设置为正常的白色背景
//inputName:输入框对象的ID名
function removeInputDrak(inputName){
	$("#"+inputName).css("background-color","white");
	$("#"+inputName).css("color","#000000");
	$("#"+inputName).removeAttr("readonly");
}
//将输入框设置为正常的白色背景
//inputObj:输入框Jquery对象
function removeInputObjDrak(inputObj){
	$(inputObj).css("background-color","white");
	$(inputObj).css("color","#000000");
	$(inputObj).removeAttr("readonly");
}

//批量处理输入框
//inputNames:输入框名称字符串，以"aaa,bbb"格式书写
//mode:模式true为设置为默认为正常框，false为设置为只读模式
function setInputs(inputNames,mode){
	var inputArr;
	if(isNotEmpty(inputNames)){
		inputArr=inputNames.split(',');
	}
	for (var i = 0; i < inputArr.length; i++) {
		if(mode){
			removeInputDrak(inputArr[i]);
		}else{
			setInputDrak(inputArr[i]);
		}
	}
}
//+---------------------------------------------------   
//| 将输入框里的数字字符串转换为数字
//+---------------------------------------------------
function parseToNum(str){
	return isNotEmpty(str) ? parseFloat(str) : 0;
}

//+---------------------------------------------------   
//| 将空内容转换为空字符串
//+---------------------------------------------------
function nullToEmpty(str){
	return isNotEmpty(str) ? str : '';
}
//限制只输入数字，调用代码为：[ onkeypress="javascript:return checkNum(event,this);"]
//目前无法解决中文输入的问题，若要解决可以使用onpropertychange来解决，FF下是onInput的事件来解决
function checkNum(eventObj,obj) {
	//获得当前按键的键值
	var key_code = window.event ? window.event.keyCode : eventObj.which ? eventObj.which : eventObj.charCode;
	if (!(((key_code >= 48) && (key_code <= 57)) || 
		   (key_code == 13) || 
		   (key_code == 8) || 
		   (key_code == 46) || 
		   (key_code == 45))) {
		try{
			window.event.keyCode = 0 ;
		}catch(e){
			eventObj.cancelBubble = true;
		}		
		return false;
	}
	//限制只允许输入一个小数点符号
	if (key_code == 46 && $(obj).val().indexOf(".") != -1) {
		try{
			window.event.keyCode = 0 ;
		}catch(e){
			eventObj.cancelBubble = true;
		}
		return false;
	}
	//限制只允许输入一个负数符号
	if (key_code == 45 && $(obj).val().indexOf("-") != -1) {
		try{
			window.event.keyCode = 0 ;
		}catch(e){
			eventObj.cancelBubble = true;
		}
		return false;
	}
	return true;
}

//使用ctrl+enter快速提交表单
function quickSubmitForm(eventObj){
	//获得当前按键的键值
	var key_code = window.event ? window.event.keyCode : eventObj.which ? eventObj.which : eventObj.charCode;
	if(eventObj.ctrlKey && key_code==13){
		try{
			quickSubmitTempFunction();
		}catch(e){}
	}
}

//通过调用该方法防止事件冒泡
function blockEventUp(event){
	try{
		event.stopPropagation();
	}catch(e){
		event.cancelBubble = true;
	}
}
//将一个数组对象的所有值转换成"aa,bb,cc"格式的字符串
//若只需要转换成'aaa,bbb,ccc'此类以','分割的字符串时，只需要使用array.toString()就可以达到效果
function arrayToString(array,splitKey){
	var key = isNotEmpty(splitKey)?splitKey:',';
	return isNotEmpty(array)?array.join(key):'';
}

//将"aa,bb,cc"格式的字符串转换为数组对象
//splitKey:分割关键字符，若用户未设置，则默认使用','
function stringToArray(str,splitKey){
	var key = isNotEmpty(splitKey)?splitKey:',';
	if(isNotEmpty(str)){
		return str.indexOf(key)!=-1 ? str.split(key) : new Array(str); 
	}else{
		return new Array();
	}
}

//根据URL内容返回当前连接符号应该是?还是&
function getUrlConnCode(url){
	return url.indexOf('?')!=-1 ? '&' : '?';
}

//保留小数点位数
function MyNumloop(num,n){
	var temp = 1;
	var temp2 = "";
	for(var i=0;i<n;i++){
		temp = temp * 10;
		temp2 = temp2 + "0";
	}
	if(num==0){
		if(n==0)			
			return "0";
		else
			return "0."+temp2;
	}
	if(isNaN(num) || num==""){return "";}
	var result = (Math.round(parseFloat(num)*temp)/temp).toString();
	if(result.indexOf(".")==-1){
		if(n==0)
			return result;
		else
			return result + "." + temp2;
	}
	else
		return (result+temp2).substr(0,1 + parseInt(n) + parseInt((result+temp2).indexOf(".")));
}

//清空表单数据
//formName表单ID
//exceptIds不清空内容的控件ID集,数据格式为Array["name","id",...]
function resetForm(formName,exceptIds){
	var ids = '';
	if(isNotEmpty(exceptIds)){
		var splitStr = '';
		for(var i=0;i<exceptIds.length;i++){
			splitStr = ids.length>0?',':'';
			ids += splitStr + '#'+exceptIds[i];
		}
	}
	$('#'+ formName+' input').not(':button,:submit,:reset,:checkbox,:radio').not(ids).val('');
	$('#'+ formName+' input:checkbox,input:radio').removeAttr('checked').removeAttr('selected');
	$('#'+ formName+' textarea').not(ids).val('');
	$('#'+ formName+' select').not(ids).val('');
}

//在指定秒数后清空指定对象内的内容
function delayClearText(objId,second){
	if(isNotEmpty(objId) && isNotEmpty(second)){
		var tTime;
		try{
			tTime = parseInt(second);
		}catch(e){
			tTime = 3;
		}
		window.setTimeout("$(\"#"+objId+"\").html('')", tTime * 1000);
	}
}

//除法函数，用来得到精确的除法结果
//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用：accDiv(arg1,arg2)
//返回值：arg1除以arg2的精确结果
function accDiv(arg1,arg2){
	var t1=0,t2=0,r1,r2;
    try{t1=arg1.toString().split(".")[1].length;}catch(e){}
    try{t2=arg2.toString().split(".")[1].length;}catch(e){}
    with(Math){
		r1=Number(arg1.toString().replace(".",""));
        r2=Number(arg2.toString().replace(".",""));
        return (r1/r2)*pow(10,t2-t1);
    }
}

//给Number类型增加一个div方法，调用起来更加方便。
Number.prototype.div = function (arg){
	return accDiv(this, arg);
};

//乘法函数，用来得到精确的乘法结果
//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用：accMul(arg1,arg2)
//返回值：arg1乘以arg2的精确结果
function accMul(arg1,arg2){
	var m=0,s1=arg1.toString(),s2=arg2.toString();
	try{m+=s1.split(".")[1].length;}catch(e){}
	try{m+=s2.split(".")[1].length;}catch(e){}
	return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}

//给Number类型增加一个mul方法，调用起来更加方便。
Number.prototype.mul = function (arg){
	return accMul(arg, this);
};

//加法函数，用来得到精确的加法结果
//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用：accAdd(arg1,arg2)
//返回值：arg1加上arg2的精确结果
function accAdd(arg1,arg2){
	var r1,r2,m;
	try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
	try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
	m=Math.pow(10,Math.max(r1,r2));
	return (Number(arg1)*m + Number(arg2)*m)/m;
}

//给Number类型增加一个add方法，调用起来更加方便。
Number.prototype.add = function (arg){
	return accAdd(arg,this);
};

//减法函数，用来得到精确的加法结果
//说明：javascript的减法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用：accSub(arg1,arg2)
//返回值：arg1减上arg2的精确结果
function accSub(arg1,arg2){
	return accAdd(arg1,-arg2);
}

//给Number类型增加一个sub方法，调用起来更加方便。
Number.prototype.sub = function (arg){
	return accSub(this,arg);
};

//判断当前浏览器是否为IE
function isIE(){
    var ua = navigator.userAgent.toLowerCase(),
    check = function(r){
        return r.test(ua);
    },
    //isStrict = document.compatMode == "CSS1Compat",
    isOpera = check(/opera/),
    isChrome = check(/chrome/),
    //isWebKit = check(/webkit/),
    isSafari = !isChrome && check(/safari/),
    isSafari3 = isSafari && check(/version\/3/),
    isSafari4 = isSafari && check(/version\/4/),
    isIE = !isOpera && check(/msie/),
    isIE7 = isIE && check(/msie 7/),
    isIE8 = isIE && check(/msie 8/);
    //isGecko = !isWebKit && check(/gecko/),
    //isGecko3 = isGecko && check(/rv:1\.9/),
    //isBorderBox = isIE && !isStrict,
    //isWindows = check(/windows|win32/),
    //isMac = check(/macintosh|mac os x/),
    //isAir = check(/adobeair/),
    //isLinux = check(/linux/),
    //isSecure = /^https/i.test(window.location.protocol);
    return isIE;
}
//表单数据自动填充
//formId:表单ID名称
//dataObj:通过Ajax查询返回的model数据json对象
//modelName:JSP中控件设置name属性时的model对象名前缀（trLine.lineName为例，此处应传递trLine字符，请注意大小写区分）
function formDataFill(formId,dataObj,modelName){
	var formObj = $("#"+formId);
	if(formObj.size()==0 || typeof(dataObj) == 'undefined' || isEmpty(modelName)){
		return;
	}
	var property,iptName,value;
	for(property in dataObj){
		value = eval('dataObj.'+property);
		if(typeof(value) == 'string' || typeof(value) == 'number' || typeof(value) == 'boolean');{
			iptName = modelName + '.' + property;
			$("[name='"+iptName+"']",formObj).not(':button,:submit,:reset,:checkbox,:radio').val(value);
		}
	}
}